<?php

# 工厂方法
# 如果新增 oracle 类型,怎么办?
# 服务端要修改 Factory 内容 (在 java,c++ 中,修改后还需要再编译)
# 在面向对象法则中, 有一个重要的开闭原则 --- 对于修改是封闭的, 对于扩展是开放的

# 共同接口
interface db
{
    public function conn();
}

# 服务端开发 (不知道会被谁调用)
class dbmysql implements db
{

    public function conn()
    {
        echo "conn mysql ok";
    }
}

class dbsqlite implements db
{

    public function conn()
    {
        echo "conn dbsqlite ok";
    }
}

# 服务器新增 oracle 类
class dboracle implements db
{

    public function conn()
    {
        echo "conn oracle ok";
    }
}

#[('工厂方法')]
interface Factory
{
    public function createDb();
}

class mysqlFactory implements Factory
{
    public function createDb()
    {
        return new dbmysql();
    }
}

class sqliteFactory implements Factory
{
    public function createDb()
    {
        return new dbsqlite();
    }
}

#[('add pracle')]
class oracleFactory implements Factory
{
    public function createDb()
    {
        return new dboracle();
    }
}

#[('客户端')]
$fact = new mysqlFactory();
$db   = $fact->createDb();
$db->conn();

$fact = new sqliteFactory();
$db   = $fact->createDb();
$db->conn();

#[('add oracle')]
$fact = new oracleFactory();
$db   = $fact->createDb();
$db->conn();
